from queue import Queue
import threading

class DeviceABC(object):
    '''
    Description:
        设备基类，设备，如功率分析仪，台架，CAN 硬件设备，都统称为设备
        设备有一些基本的特备特性：
            - 打开关闭
            - 配置
            - 发送
    '''
    def __init__(self, name: 'str') -> None:
        super().__init__()
        self._cmdQueue = Queue(1000)    # 本设备的指令列表
        self._setStop = False           # 指示本设备是否Started
        self._task = threading.Thread() # 本设备的任务
        self._name = name               # 本设备的名字
        self._type = 'None'             # 本设备的类型
        self._config = dict()           # 本设备的Config

    def UpdateConfig(self, config: 'dict') -> None:
        '''
        Function:
            设置本设备的配置
        '''
        if (not self.IsRunning()):
            self._config.update(config)

    def Start(self) -> None:
        '''
        Function:
            启动设备：
            - 开线程调用 self._Start 函数
        '''
        self._task = threading.Thread(target=self._Start)
        self._task.start()

    def _Start(self) -> None:
        '''
        Function:
            启动设备的具体函数
        '''
        return

    def Stop(self) -> None:
        '''
        Function:
            关闭设备，或者将设备设置为关闭模式
        '''
        self._setStop = True

    def Cmd(self, data: 'dict') -> None:
        '''
        Function:
            向设备发送数据，让设备做某件事情
            本质上是向本设备的指令列表中追加数据
        '''
        self._cmdQueue.put(data, True)

    def IsRunning(self) -> 'bool':
        '''
        Function；
            返回本设备是否正在运行
        '''
        return self._task.is_alive()
        
    def Export(self) -> 'dict':
        '''
        Function:
            导出本设备的Config
        '''
        return self._config
    
    def Name(self) -> 'str':
        '''
        Fucntion:
            获取本设备的名字
        '''
        return self._name

    def Type(self) -> 'str':
        '''
        Fucntion:
            获取本设备的类型
        '''
        return self._type